double LotSize = 0.1;
double ExpireAfter = 15; // min
double WaitPoints = 6.0;
//-------
double TP = 3.0;
double SL = 6.0;
double OKTP = 25 ;
double MinimumAccountEquity = 0;
    
double SleepTime = 0 ; // Seconds 60 
double MaxOpenedOrderCount  = 1 ; 

//+------------------------------------------------------------------+
int start()
  {
  
//----
   if(AccountEquity() < MinimumAccountEquity){
      Print("System Exit");
      return(0);
   }
//----
   Print("OrdersTotal: " ,OrdersTotal(), " AccountBalance: ",AccountBalance(), " LastError: " , ErrorDescription(GetLastError()));         
   
   int BUYSTOPS = 0;
   int SELLSTOPS = 0;
   
   for(int i=0; i<OrdersTotal(); i++)   {
         if (OrderSelect(i,SELECT_BY_POS)==true){
                  //----
                  if(OrderType()==OP_BUYSTOP){
                     // sell stop order
                     BUYSTOPS++;
                  } if(OrderType()==OP_SELLSTOP){
                     // sell stop order
                     SELLSTOPS++;
                  } if(OrderType()==OP_SELL){
                     // Modify Trailing Stop for sell
                     ModifyTrailingStop();
                  } if(OrderType()==OP_BUY){
                     // Modify Trailing Stop for buy
                     ModifyTrailingStop();
                  }
                  //----
         }//if end
   }//For end
   
//----   
   if(BUYSTOPS < MaxOpenedOrderCount){
      openBuyStopOrder(MaxOpenedOrderCount - BUYSTOPS);//**************************
   }
   if(SELLSTOPS < MaxOpenedOrderCount){
      openSellStopOrder(MaxOpenedOrderCount - SELLSTOPS);//**************************
   }
//----
   if(SleepTime > 0){
      Sleep(1*SleepTime*1000);
   }
//----   
   return(0);
  }
//+------------------------------------------------------------------+
void ModifyTrailingStop(){
   bool modified;
   double NewSL;
   double NewTP;
   
   if(OrderProfit() > OKTP){
      if(OrderType()==OP_SELL){
         RefreshRates();
         NewSL = OrderStopLoss() - (Bid - OrderOpenPrice()) ;
         NewTP = OrderTakeProfit() - (Bid - OrderOpenPrice()) ;
         
         if(OrderStopLoss() >= NewSL ){ 
            RefreshRates();
            modified = OrderModify(OrderTicket(),OrderOpenPrice(), NewSL , NewTP ,Green);
            Print("Order Modified OP_SELL : ",modified," profite: " , OrderProfit());
         }else{
            // close the order
            RefreshRates();
            OrderClose(OrderTicket() ,OrderLots (), Ask, 0);
            deleteAllPendingOrders();
         }
         
      }else if(OrderType()==OP_BUY){
         RefreshRates();
         NewSL = OrderStopLoss() + (Ask - OrderOpenPrice()) ;
         NewTP = OrderTakeProfit() + (Ask - OrderOpenPrice()) ;
         
         if(OrderStopLoss() <= NewSL ){ 
            RefreshRates();
            modified = OrderModify(OrderTicket(),OrderOpenPrice(), NewSL , NewTP ,Green);
            Print("Order Modified OP_BUY : ",modified," profite: " , OrderProfit());
         }else{
            // close the order
            RefreshRates();
            OrderClose(OrderTicket() ,OrderLots (), Bid, 0);
            deleteAllPendingOrders();
         }
         
      }
      Print("ModifyTrailingStop : ", ErrorDescription(GetLastError()));     
   }
}  
//+------------------------------------------------------------------+
void openSellStopOrder(int count){
   for(int i=0; i<count; i++)   {
      RefreshRates();
      int TicketNo=OrderSend(Symbol(),OP_SELLSTOP,LotSize,Bid - WaitPoints ,0, Bid + (SL - WaitPoints),Bid-(WaitPoints + TP),NULL,0,TimeCurrent()+(ExpireAfter * 60));
      Print("Open Sell Stop Order : ",TicketNo , " LastError: " , ErrorDescription(GetLastError()));
   }
}
//+------------------------------------------------------------------+
void openBuyStopOrder(int count){
   for(int i=0; i<count; i++)   {
      RefreshRates();
      int TicketNo=OrderSend(Symbol(), OP_BUYSTOP,LotSize,Ask + WaitPoints ,0, Ask - (SL - WaitPoints),Ask+(WaitPoints + TP),NULL,0,TimeCurrent()+(ExpireAfter * 60));
      Print("Open Buy Stop Order : ",TicketNo , " LastError: " , ErrorDescription(GetLastError()));
   }
}
//+------------------------------------------------------------------+
void deleteAllPendingOrders(){
   for(int i=0; i<OrdersTotal(); i++)   {
      if (OrderSelect(i,SELECT_BY_POS)==true){
            if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP){
               RefreshRates();
               OrderDelete(OrderTicket());   
            }
      }
   }
}
//+------------------------------------------------------------------+
string ErrorDescription(int error_code) {
string error_string;
 switch(error_code) {
      //---- codes returned from trade server
      case 0:
      case 1:   error_string="no error";                                                  break;
      case 2:   error_string="common error";                                              break;
      case 3:   error_string="invalid trade parameters";                                  break;
      case 4:   error_string="trade server is busy";                                      break;
      case 5:   error_string="old version of the client terminal";                        break;
      case 6:   error_string="no connection with trade server";                           break;
      case 7:   error_string="not enough rights";                                         break;
      case 8:   error_string="too frequent requests";                                     break;
      case 9:   error_string="malfunctional trade operation (never returned error)";      break;
      case 64:  error_string="account disabled";                                          break;
      case 65:  error_string="invalid account";                                           break;
      case 128: error_string="trade timeout";                                             break;
      case 129: error_string="invalid price";                                             break;
      case 130: error_string="invalid stops";                                             break;
      case 131: error_string="invalid trade volume";                                      break;
      case 132: error_string="market is closed";                                          break;
      case 133: error_string="trade is disabled";                                         break;
      case 134: error_string="not enough money";                                          break;
      case 135: error_string="price changed";                                             break;
      case 136: error_string="off quotes";                                                break;
      case 137: error_string="broker is busy (never returned error)";                     break;
      case 138: error_string="requote";                                                   break;
      case 139: error_string="order is locked";                                           break;
      case 140: error_string="long positions only allowed";                               break;
      case 141: error_string="too many requests";                                         break;
      case 145: error_string="modification denied because order too close to market";     break;
      case 146: error_string="trade context is busy";                                     break;
      case 147: error_string="expirations are denied by broker";                          break;
      case 148: error_string="amount of open and pending orders has reached the limit";   break;
      case 149: error_string="hedging is prohibited";                                     break;
      case 150: error_string="prohibited by FIFO rules";                                  break;
      //---- mql4 errors
      case 4000: error_string="no error (never generated code)";                          break;
      case 4001: error_string="wrong function pointer";                                   break;
      case 4002: error_string="array index is out of range";                              break;
      case 4003: error_string="no memory for function call stack";                        break;
      case 4004: error_string="recursive stack overflow";                                 break;
      case 4005: error_string="not enough stack for parameter";                           break;
      case 4006: error_string="no memory for parameter string";                           break;
      case 4007: error_string="no memory for temp string";                                break;
      case 4008: error_string="not initialized string";                                   break;
      case 4009: error_string="not initialized string in array";                          break;
      case 4010: error_string="no memory for array\' string";                             break;
      case 4011: error_string="too long string";                                          break;
      case 4012: error_string="remainder from zero divide";                               break;
      case 4013: error_string="zero divide";                                              break;
      case 4014: error_string="unknown command";                                          break;
      case 4015: error_string="wrong jump (never generated error)";                       break;
      case 4016: error_string="not initialized array";                                    break;
      case 4017: error_string="dll calls are not allowed";                                break;
      case 4018: error_string="cannot load library";                                      break;
      case 4019: error_string="cannot call function";                                     break;
      case 4020: error_string="expert function calls are not allowed";                    break;
      case 4021: error_string="not enough memory for temp string returned from function"; break;
      case 4022: error_string="system is busy (never generated error)";                   break;
      case 4050: error_string="invalid function parameters count";                        break;
      case 4051: error_string="invalid function parameter value";                         break;
      case 4052: error_string="string function internal error";                           break;
      case 4053: error_string="some array error";                                         break;
      case 4054: error_string="incorrect series array using";                             break;
      case 4055: error_string="custom indicator error";                                   break;
      case 4056: error_string="arrays are incompatible";                                  break;
      case 4057: error_string="global variables processing error";                        break;
      case 4058: error_string="global variable not found";                                break;
      case 4059: error_string="function is not allowed in testing mode";                  break;
      case 4060: error_string="function is not confirmed";                                break;
      case 4061: error_string="send mail error";                                          break;
      case 4062: error_string="string parameter expected";                                break;
      case 4063: error_string="integer parameter expected";                               break;
      case 4064: error_string="double parameter expected";                                break;
      case 4065: error_string="array as parameter expected";                              break;
      case 4066: error_string="requested history data in update state";                   break;
      case 4099: error_string="end of file";                                              break;
      case 4100: error_string="some file error";                                          break;
      case 4101: error_string="wrong file name";                                          break;
      case 4102: error_string="too many opened files";                                    break;
      case 4103: error_string="cannot open file";                                         break;
      case 4104: error_string="incompatible access to a file";                            break;
      case 4105: error_string="no order selected";                                        break;
      case 4106: error_string="unknown symbol";                                           break;
      case 4107: error_string="invalid price parameter for trade function";               break;
      case 4108: error_string="invalid ticket";                                           break;
      case 4109: error_string="trade is not allowed in the expert properties";            break;
      case 4110: error_string="longs are not allowed in the expert properties";           break;
      case 4111: error_string="shorts are not allowed in the expert properties";          break;
      case 4200: error_string="object is already exist";                                  break;
      case 4201: error_string="unknown object property";                                  break;
      case 4202: error_string="object is not exist";                                      break;
      case 4203: error_string="unknown object type";                                      break;
      case 4204: error_string="no object name";                                           break;
      case 4205: error_string="object coordinates error";                                 break;
      case 4206: error_string="no specified subwindow";                                   break;
      default:   error_string="unknown error";
     }
 return(error_string);
}